home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / os2 / ext2_200.zip / EXT2_SRC.ZIP / 32BITS / EXT2-OS2 / UTIL / ISFAT.C < prev    next >
C/C++ Source or Header  |  1996-09-17  |  5KB  |  157 lines

  1. #ifdef __IBMC__
  2. #pragma strings(readonly)
  3. #endif
  4. //
  5. // $Header: D:/32bits/ext2-os2/util/RCS/isfat.c,v 1.1 1996/08/26 19:05:45 Willm Exp Willm $
  6. //
  7.  
  8. // Linux ext2 file system driver for OS/2 2.x and WARP - Allows OS/2 to     
  9. // access your Linux ext2fs partitions as normal drive letters.
  10. // Copyright (C) 1995, 1996 Matthieu WILLM 
  11. //
  12. // This program is free software; you can redistribute it and/or modify
  13. // it under the terms of the GNU General Public License as published by
  14. // the Free Software Foundation; either version 2 of the License, or
  15. // (at your option) any later version.
  16. //
  17. // This program is distributed in the hope that it will be useful,
  18. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. // GNU General Public License for more details.
  21. //
  22. // You should have received a copy of the GNU General Public License
  23. // along with this program; if not, write to the Free Software
  24. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  
  26. #define INCL_DOSERRORS
  27. #define INCL_NOPMAPI
  28. #include <os2.h>        // From the "Developer Connection Device Driver Kit" version 2.0
  29.  
  30.  
  31. #include <string.h>
  32. #include <os2/types.h>
  33. #include <os2/devhlp32.h>
  34. #include <os2/os2proto.h>
  35.  
  36. #ifdef TEST_ISFAT
  37. #include <stdio.h>
  38. #endif
  39.  
  40. //
  41. // Forbidden FAT characters (excluding '.')
  42. // (From the OS/2 Command reference)
  43. //
  44. static char forbidden_chars[] = {
  45.                                  0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 
  46.                                  0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 
  47.                                  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 
  48.                                  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 
  49.                                  '\\', '/', ':', '*', '?', '"', '<', '>', '|', ',', 
  50.                                  '+', '=', '[', ']', ';',
  51.                                  '\0'
  52.                                 };
  53.  
  54. //
  55. // Forbidden FAT file names
  56. // (From the OS/2 Command reference)
  57. //
  58. static pchar forbidden_names[] = {
  59.                                   "KBD$",
  60.                                   "PRN",
  61.                                   "NUL",
  62.                                   "COM1",
  63.                                   "COM2",
  64.                                   "COM3",
  65.                                   "COM4",
  66.                                   "CLOCK$",
  67.                                   "LPT1",
  68.                                   "LPT2",
  69.                                   "LPT3",
  70.                                   "CON",
  71.                                   "SCREEN$",
  72.                                   "POINTER$",
  73.                                   "MOUSE$"
  74.                                  };
  75. int nb_forbiden_names = 15;
  76.  
  77. //
  78. // Tests if a file name (WITHOUT PATH) is FAT compliant
  79. // 1 - FAT compliant
  80. // 0 - non FAT compliant
  81. //
  82. // ... could be better but seems to work !
  83. //
  84. int isfat(pchar component) {
  85.     int len = strlen(component);
  86.     int i, j, pos;
  87.  
  88.  
  89.     if (strcmp(component, ".") == 0) {            // "."
  90.         return 1;
  91.     }
  92.  
  93.     if (strcmp(component, "..") == 0) {            // ".."
  94.         return 1;
  95.     }
  96.  
  97.     if ((len > 12) || (len == 0)) {
  98.         return 0;                    // lenght > 8.3 or null
  99.     }
  100.  
  101.     for (i = 0;i < nb_forbiden_names  ; i++) {
  102.        if (strcmp(component, forbidden_names[i]) == 0) {
  103.            return 0;
  104.        } /* endif */
  105.     } /* endfor */
  106.  
  107.     if (strpbrk(component, forbidden_chars) > 0) {  
  108.         return 0;                    // Forbidden characters present
  109.     }
  110.  
  111.     j = 0;
  112.     pos = 0;
  113.     for (i = 0; i < len; i++) {
  114.         if (component[i] == '.') {
  115.             j++;            
  116.         } else{      
  117.            if (j == 0) {
  118.                pos++;
  119.            } /* endif */
  120.         }
  121.     }     
  122.  
  123.     if (j > 1) {                    // More than one '.'
  124.         return 0;
  125.     }
  126.  
  127.     if (j == 0) {                    // No '.'
  128.         if (len > 8) {
  129.             return 0;
  130.         } else {
  131.             return 1;
  132.         }
  133.     }
  134.  
  135.     if (j == 1) {
  136.         if ((len - pos > 4) || (pos == 0)) {            // '.' in front or extension > 3
  137.             return 0;
  138.         } else {
  139.             if (pos > 8) {
  140.                 return 0;                               // name > 8
  141.             } else {
  142.                return 1;
  143.             } /* endif */
  144.         }
  145.     }
  146.  
  147.     return 0;
  148. }
  149.  
  150.  
  151. #ifdef TEST_ISFAT
  152. int main(int argc, char **argv) {
  153.  
  154.     printf("%d\n", isfat(argv[1]));
  155. }
  156. #endif
  157.